﻿#include "pch.h"
#include "PictureCtrl.h"

BEGIN_MESSAGE_MAP(PictureCtrl, CWnd)
    ON_WM_PAINT()
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

/**
 * 构造方法。
 * @param hasBorder 有边框则为 TRUE，否则为 FALSE
 * @param id        id
 * @param imageDC   图片保存者
 * @param parent    父窗口
 * @param rect      位置、尺寸
 */
PictureCtrl::PictureCtrl(BOOL hasBorder, UINT id, CDC* imageDC, CWnd* parent, CRect* rect) :
    mHasBorder(hasBorder),
    mId(id) {
    // 创建
    CWnd::Create(NULL, NULL, WS_CHILD | WS_VISIBLE, *rect, parent, id);

    // 初始化成员
    mImage.CreateCompatibleBitmap(CWnd::GetDC(), rect->Width(), rect->Height());
    mImageDC.CreateCompatibleDC(CWnd::GetDC());
    mImageDC.SelectObject(&mImage);
    mImageDC.BitBlt(0, 0, rect->Width(), rect->Height(), imageDC, rect->left, rect->top, SRCCOPY);
    mOriginalPosition.x = rect->left;
    mOriginalPosition.y = rect->top;
}

/**
 * 获取当前位置。
 * @param position  当前位置
 */
void PictureCtrl::GetPosition(CPoint* position) {
    CRect rect;
    CWnd::GetWindowRect(rect);
    CWnd::GetParent()->ScreenToClient(rect);
    position->x = rect.left;
    position->y = rect.top;
}

/**
 * 判断自身是否在初始位置。
 * @return 在初始位置则返回 TRUE，否则返回 FALSE
 */
BOOL PictureCtrl::IsOnOriginalPosition() {
    CPoint currentPosition;
    this->GetPosition(&currentPosition);
    return currentPosition == mOriginalPosition;
}

/**
 * 鼠标左键抬起事件的响应方法。
 * @param flags 事件相关信息
 * @param point 左键抬起时鼠标指针的位置
 */
void PictureCtrl::OnLButtonUp(UINT flags, CPoint point) {
    CWnd::OnLButtonUp(flags, point);
    CWnd::GetParent()->GetParent()->SendMessage(WM_COMMAND, mId, (LPARAM)this->GetSafeHwnd());
}

/**
 * 重绘事件的响应方法。
 */
void PictureCtrl::OnPaint() {
    CWnd::OnPaint();

    CClientDC clientDC(this);
    CRect clientRect;
    CWnd::GetClientRect(clientRect);
    clientDC.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &mImageDC, 0, 0, SRCCOPY);
    if (mHasBorder) {
        clientDC.DrawEdge(clientRect, EDGE_RAISED, BF_RECT);
    }
}

/**
 * 设置边框。
 * @param hasBorder 有边框则为 TRUE，否则为 FALSE
 */
void PictureCtrl::SetBorder(BOOL hasBorder) {
    if (mHasBorder == hasBorder) {
        return;
    }
    mHasBorder = hasBorder;
    CWnd::Invalidate(FALSE);
}
